/*
 * @Description:
 * @Author: HYH
 * @LastEditors: HYH
 * @LastEditTime: 2023-02-10 17:51:05
 */
import PizZip from 'pizzip'
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'
import Docxtemplater from 'docxtemplater'

/**有哪些文件名 */
type IDocName = 'report.docx' | 'repair.docx'

/**
 * @description 导出word文档
 * @param {*} templateDocx 模板文档名称
 * @param {*} data    文档数据
 * @param {*} fileName 生成的文件名
 */
export const useDocxtemplater = (templateDocx: IDocName, data: any = {}, fileName: string) => {
  // 读取并获得模板文件的二进制内容   （public文件夹下的 .docx文档）
  JSZipUtils.getBinaryContent(`/${templateDocx}`, async (error: any, content: any) => {
    // 抛出异常
    if (error) throw error

    // 创建一个PizZip实例，内容为模板的内容
    const zip = new PizZip(content)

    // 创建并加载docx templater实例对象
    const doc = new Docxtemplater().loadZip(zip)

    // 设置模板变量的值F
    doc.setData(data)
    // 空值设置为 ''
    doc.setOptions({
      nullGetter: () => ''
    })

    try {
      // 用模板变量的值替换所有模板变量
      doc.render()
    } catch (error: any) {
      console.log(`error ==>`, error)
    }

    // 生成一个代表docxtemplater对象的zip文件（不是一个真实的文件，而是在内存中的表示）
    const out = await doc.getZip().generate({
      type: 'blob',
      mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    })
    // 将目标文件对象保存为目标类型的文件，并命名
    saveAs(out, `${fileName}-${new Date().getTime()}.docx`)
  })
}
